package main

import (
	"crypto/sha256"
	_ "embed"
	"encoding/hex"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"strings"
	"time"
)

//go:embed config.yaml
var Url string  // 替换为云端服务器的API地址

func main() {
	// 获取用户主目录
	homeDir, err := os.UserHomeDir()
	if err != nil {
		log.Fatalf("Failed to get user home directory: %v", err)
	}

	// 构建公钥文件路径
	pubKeyPath := filepath.Join(homeDir, ".ssh", "id_rsa.pub")

	// 检查文件是否存在
	if _, err := os.Stat(pubKeyPath); os.IsNotExist(err) {
		log.Fatalf("Public key file does not exist: %s", pubKeyPath)
		fmt.Println("公钥文件不存在", pubKeyPath)
	}

	// 读取公钥文件内容
	pubKey, err := ioutil.ReadFile(pubKeyPath)
	if err != nil {
		log.Fatalf("Failed to read public key file: %v", err)
		fmt.Println("公钥文件内容为空", pubKeyPath)
	}

	// 提取公钥内容（去掉换行符）
	pubKeyStr := strings.TrimSpace(string(pubKey))

	// 打印公钥
	// fmt.Println("Public Key:")
	// fmt.Println(string(pubKey))

	// 打印公钥和用户名
	username := ExtractUsernameFromPublicKey(pubKeyStr)
	fmt.Println("用户名:", username)

	fmt.Println("开始更新云服务器规则组ip 稍等片刻...")
	// 创建 HTTP 请求
	req, err := http.NewRequest("POST", Url, strings.NewReader(GenerateSignature(pubKeyStr, username))) // bytes.NewBufferString(pubKeyStr)
	if err != nil {
		log.Fatalf("Failed to create HTTP request: %v", err)
	}

	// 添加用户名到请求头
	req.Header.Set("User", username)

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("Failed to send request to cloud server: %v", err)
	}
	defer resp.Body.Close()

	// 读取服务器响应
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("Failed to read response from cloud server: %v", err)
	}

	// 打印服务器响应
	fmt.Println("响应体:", string(body))
	if string(body) == "ok" {
		fmt.Println("更新成功", time.Now().Format("2006-01-02 15:04:05"))
	}

	fmt.Println("10s后自动关闭")

	time.Sleep(10 * time.Second)
}

// 从公钥中提取用户名（注释部分）
func ExtractUsernameFromPublicKey(pubKey string) string {
	// OpenSSH 公钥格式：<algorithm> <key> <comment>
	parts := strings.Fields(pubKey)
	if len(parts) < 3 {
		return "" // 如果公钥格式不正确，返回空字符串
	}
	return parts[2] // 注释部分是第三部分
}

// 生成签名（使用 SHA-256）
func GenerateSignature(data string,username string) string {
	// 创建 SHA-256 哈希对象
	hash := sha256.New()

	// 写入数据
	hash.Write([]byte(username + data + time.Now().Format("2006-01-02 15:04")))

	// 计算哈希值
	hashSum := hash.Sum(nil)

	// 将哈希值转换为十六进制字符串
	return hex.EncodeToString(hashSum)
}